"""SQL配置验证工具类"""
from typing import Dict, Any
import json
from pathlib import Path

class SQLConfigValidator:
    """SQL配置验证工具类"""

    @classmethod
    def validate_sql_json(cls, sql_data: Dict[str, Any]) -> None:
        """验证SQL描述文件的JSON内容

        Args:
            sql_data: SQL描述文件的JSON内容

        Raises:
            ValueError: 当JSON内容格式不正确时抛出
        """
        # 验证是否为字典
        if not isinstance(sql_data, dict):
            raise ValueError("SQL描述文件格式错误: 不是有效的JSON对象")

        # 验证必需字段
        required_fields = ["table", "columns"]
        for field in required_fields:
            if field not in sql_data:
                raise ValueError(f"SQL描述文件格式错误: 缺少{field}字段")

        # 验证表信息
        cls._validate_table_info(sql_data["table"])
        # 验证字段信息
        cls._validate_columns_info(sql_data["columns"])

    @classmethod
    def _validate_table_info(cls, table: dict) -> None:
        """验证表信息

        Args:
            table: 表信息字典

        Raises:
            ValueError: 当表信息格式不正确时抛出
        """
        if not isinstance(table, dict):
            raise ValueError("SQL描述文件格式错误: table字段不是有效的JSON对象")

        # 验证必需的表属性
        required_table_fields = ["name"]
        for field in required_table_fields:
            if field not in table:
                raise ValueError(f"SQL描述文件格式错误: 表缺少{field}属性")

    @classmethod
    def _validate_columns_info(cls, columns: dict) -> None:
        """验证字段信息

        Args:
            columns: 字段信息字典

        Raises:
            ValueError: 当字段信息格式不正确时抛出
        """
        if not isinstance(columns, dict):
            raise ValueError("SQL描述文件格式错误: columns字段不是有效的JSON对象")

        # 验证每个字段的必需属性
        for column_name, column in columns.items():
            if not isinstance(column, dict):
                raise ValueError(f"SQL描述文件格式错误: 字段{column_name}不是有效的JSON对象")

            required_column_fields = ["name", "type", "nullable", "comment"]
            for field in required_column_fields:
                if field not in column:
                    raise ValueError(f"SQL描述文件格式错误: 字段{column_name}缺少{field}属性")

            # 验证类型信息
            type_info = column["type"]
            if not isinstance(type_info, dict):
                raise ValueError(f"SQL描述文件格式错误: 字段{column_name}的type属性不是有效的JSON对象")
            if "name" not in type_info:
                raise ValueError(f"SQL描述文件格式错误: 字段{column_name}的type属性缺少name")

    @classmethod
    def read_and_validate_sql_json(cls, json_file: Path, validate: bool = True) -> Dict[str, Any]:
        """读取并验证SQL JSON文件

        Args:
            json_file: JSON文件路径

        Returns:
            Dict[str, Any]: 验证后的JSON数据
        """
        if not json_file.exists():
            raise Exception(f"JSON文件不存在: {json_file}")

        with open(json_file, "r", encoding="utf-8") as f:
            try:
                data = json.load(f)
            except json.JSONDecodeError as e:
                raise Exception(f"JSON格式无效: {str(e)}")

        if validate:
            cls.validate_sql_json(data)
        return data
